package com.hr.tuling.list;

/**
 * @author ：zhz
 * @date ：Created in 2020/11/24
 * @version: V1.0
 * @slogan: 天下风云出我辈，一入代码岁月催
 * @description:
 **/
public class MyLinkedList {
    private ListNode head;

    //插入链表的头部	 data就是插入的数据
    public void insertHead(int data){
        //不管当前是否有数据,只需要把新节点的指针，指向已有的head，再把head指向新节点（栈内存的引用）
        ListNode newNode=new ListNode(data);
        newNode.next=head;
        head=newNode;
    }

    //插入链表的中间 假设定义在第N个插入 O(n)
    public void insertNth(int data,int position){
        if (position==0){
            insertHead(data);//头插入
        }else {
            ListNode cur=head;
            for (int i = 0; i < position; i++) {
                cur=cur.next;//向后遍历到插入元素的前一个节点
            }
            ListNode newNode=new ListNode(data);//创建新节点
            //插入操作
            newNode.next=cur.next;
            cur.next=newNode;
        }


    }
    //删除头结点
    public void deleteHead(){//O(1)
        head=head.next;
    }
    //删除链表的中间
    public void deleteNth(int position) {//O(n)
        if (position==0){
            deleteHead();
        }else{
            ListNode cur=head;
            for (int i = 0; i < position; i++) {
                cur=cur.next;//向后遍历到插入元素的前一个节点
            }
            //删除操作
            cur.next=cur.next.next;//cur.next 表示的是删除的点，后一个next就是我们要指向的
        }
    }
    //找节点
    public void find(int data) {//O(n)
        ListNode cur=head;
        while (cur!=null){
            if(cur.value==data){
                break;
            }
            cur=cur.next;
        }
    }
    //打印节点
    public void print(){
        ListNode cur=head;
        while (cur!=null){
            System.out.print(cur.value+" ");
            cur=cur.next;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        MyLinkedList myList = new MyLinkedList();
        myList.insertHead(5);
        myList.insertHead(7);
        myList.insertHead(10);
        myList.print(); // 10 -> 7 -> 5
//        myList.deleteNth(0);
//        myList.print(); // 7 -> 5
//        myList.deleteHead();
//        myList.print(); // 5
//        myList.insertNth(11, 1);
//        myList.print(); // 5 -> 11
//        myList.deleteNth(1);
//        myList.print(); // 5
    }
}
